[アップデート] AWS Elemental MediaPackage で VoD コンテンツについても CDN 認証を使用したエンドポイントの保護が可能となりました!
こんにちは、大前です。
今日は、AWS Elemental MediaPackage (以下 MediaPackage)に関する下記のアップデートをご紹介します。
Secure AWS Elemental MediaPackage VOD Endpoints using CDN Authorization
どんなアップデートか
MediaPackage はライブ配信コンテンツや Video on Demand(以下 VoD)コンテンツを格納するオリジンとしての役割を持つため、CloudFront と合わせて使用される事が多いです。(よくある S3 + CloudFront 構成みたいなイメージです)
今までは、MediaPackage のエンドポイントが漏れてしまうと、ユーザから直接アクセス出来てしまうという問題があり、オリジンの保護という観点で問題がありました。
今回のアップデートで、CloudFront からリクエストされた場合のみにアクセス可能とする様な設定が可能となります。S3 + CloudFront 時の OAI と同じ様なイメージです。(実際、カスタムヘッダーで判定を行います)
ライブコンテンツについては、既に今年のはじめに上記のオリジン保護機能が追加されていましたが、今回のアップデートで Vod についても保護が出来る様になりました。これでより一層安心して MediaPackage を CloudFront のオリジンとして使用できますね。
やってみた
大まかな流れとしては、以下になります。
- MediaPackage の設定
- CloudFront の設定
- オリジン保護の設定
- オリジンが保護されている事を確認
- まで実施した時点で一度アクセス確認を行い、最終的にオリジン保護を行って MediaPackage への直アクセスが防げるか確認してみます。
1. MediaPackage の設定
まずは、MediaPackage で Vod コンテンツを配信するための設定を行います。
Packaging groups 作成
「MediaPackage」> 「Video on demand」>「Packaging groups」より、「Create」をクリックしてパッケージンググループを作成して行きます。
既に、Use authorization という項目が増えている事が確認できますね!現時点では、一旦名前(Id)のみ入力して先に進みます。
パッケージンググループが作成出来たら、作成後の画面より「Manage configurations」をクリックします。
下記の様な設定画面が開くと思いますが、特に何も弄らずに「Save」で OK です。
ただし、ソースとなるマニフェストファイル名が index.m3u8 でない場合はマニフェスト設定から修正が必要なので気をつけてください。
Assets 作成
次に、Assets を作成します。入力となるソースファイルを指定するための設定です。
「MediaPackage」> 「Video on demand」>「Assets」より、「Ingest asset」をクリックします。
設定画面では下記項目を設定し、「Ingest asset」をクリックします。
- S3 bucket name
- ソースファイルが格納されているバケット
- IAM role
- S3 への Get 操作が許可された IAM ロール
- Filename
- 入力として使用するソースファイル
- Packaging group
- 上記にて作成した Packaging group
IAM ロールがない場合には、以下ポリシー、信頼関係で IAM ロールを新規に作成してください。
IAM ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": "*" } ] }
信頼関係
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "mediapackage.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
アセットを作成したら詳細画面を開き、下部にある URL をメモしておきます。
これがコンテンツにアクセスするエンドポイントとなります。
ちなみに、現時点ではアクセス可能な状態となっています。
$ curl -I https://xxxxxxx.mediapackage-vod.ap-northeast-1.amazonaws.com/out/v1/xxxxxxxx/index.m3u8 HTTP/2 200 date: Tue, 09 Jun 2020 01:18:07 GMT content-type: application/x-mpegURL content-length: 474 server: nginx/1.16.1 cache-control: max-age=60 access-control-allow-origin: * access-control-allow-credentials: true vary: Origin x-mediapackage-request-id: 9f9406b81cb7b7ddcf7db5ca85f7e28c
2. CloudFront の設定
続いて、CloudFront を設定していきます。
細かい設定の説明は省きますが、生成されたアセットのエンドポイントを元に、オリジンには以下を設定しました。
- オリジン
- https://xxxxxxx.mediapackage-vod.ap-northeast-1.amazonaws.com
- オリジンパス
- /out/v1/xxxxx/xxxxxx
これで、「xxxxx.cloudfront.net/index.m3u8」にアクセスすれば MediaPackage のエンドポイントにアクセスされる事になります。
CloudFront のディストリビューションが作成されたら、試しにアクセスしてみます。
$ curl -I https://xxxxxx.cloudfront.net/index.m3u8 HTTP/2 200 content-type: application/x-mpegURL content-length: 474 date: Tue, 09 Jun 2020 01:34:25 GMT server: nginx/1.16.1 cache-control: max-age=60 access-control-allow-origin: * access-control-allow-credentials: true x-mediapackage-request-id: fc8b6f1a114195fad65f2e03667e42f6 x-cache: Miss from cloudfront via: 1.1 01d4e8d94c61f8f56aebaa1af365cc6e.cloudfront.net (CloudFront) x-amz-cf-pop: NRT12-C2 x-amz-cf-id: Gf36IGjkKmNjNVTcikcaJfvNxeo5GiPNBRxqnfT810xFJZmRu09Luw==
アクセスできている様なので、続いて、オリジン保護を設定していきます。
3. オリジン保護の設定
MediaPackage のオリジン保護をするための手順は以下です。
- MediaPackage から Secret Manager へのアクセスを許可する IAM ロールの作成
- 認証コードの作成
- CloudFront へのカスタムヘッダーの設定
- Secrets Manager に認証コードを保存
- MediaPackage 側で CDN 認証を有効化
1. MediaPackage から Secret Manager へのアクセスを許可する IAM ロールの作成
下記ブログと手順が同じであるため説明は割愛します。
作成した IAM ロールの ARN は後ほど使用するためメモしておきましょう。
2. 認証コードの作成
先人のブログ手順にならってコードを生成します。
$ python Python 3.8.2 (default, May 26 2020, 18:36:58) [Clang 10.0.1 (clang-1001.0.46.4)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import uuid >>> str(uuid.uuid4()) 'b08bf725-fd94-4f16-81b3-xxxxxxxx' >>>
b08bf725-fd94-4f16-81b3-xxxxxxxx が今回使用する認証コードとなります。
3. CloudFront へのカスタムヘッダーの設定
CloudFront のオリジン設定より、カスタムヘッダーを設定します。
- Header Name
- X-MediaPackage-CDNIdentifier
- Value
- 生成した認証コード
4. Secrets Manager に認証コードを保存
続いて Secrets Manager に認証コードを保存しますが、下記ブログと同じ手順であるため説明は割愛します。
IAM ロールと同様、ARN をメモしておきましょう。
5. MediaPackage 側で CDN 認証を有効化
最後に、MediaPackage で CDN 認証を有効化します。
作成したパッケージンググループを開き、「Edit」をクリックします。
編集画面にて以下の設定を行い、「Save Changes」をクリックしたらオリジン保護設定は完了です。
- Use authorization
- 有効
- Secrets role ARN
- 作成した IAM ロールの ARN
- CDN identifier secret
- Secrets Manager に認証コードを保存した時に払い出された ARN
4. オリジンが保護されている事を確認
では、オリジンがちゃんと保護されているか確認してみます。
CloudFront
$ curl -I https://xxxxxxx.cloudfront.net/index.m3u8 HTTP/2 200 content-type: application/x-mpegURL content-length: 474 date: Tue, 09 Jun 2020 01:53:57 GMT server: nginx/1.16.1 cache-control: max-age=60 access-control-allow-origin: * access-control-allow-credentials: true x-mediapackage-request-id: 6dec81a62e2940001149e1233200bfac x-cache: Miss from cloudfront via: 1.1 9ba7847d44a87e03141b3f05bd4670c8.cloudfront.net (CloudFront) x-amz-cf-pop: NRT12-C2 x-amz-cf-id: 9ajgi9D5KlzfFwybFCFZoobP4aN6o3IkOXvCw4Rti5AtRYB3wd83xw==
MediaPackage(直アクセス)
$ curl -I https://xxxxxxx.mediapackage-vod.ap-northeast-1.amazonaws.com/out/v1/xxxxxxxx/index.m3u8 HTTP/2 403 date: Tue, 09 Jun 2020 01:54:58 GMT content-type: text/html content-length: 127 server: nginx etag: "5ed80f46-7f" x-mediapackage-request-id: d21593fb85da698a3d7c3a70732ba96c
ちゃんと MediaPackage への直アクセスが出来なくなっていますね!無事に VoD コンテンツでも MediaPackage のオリジン保護が出来る事を確認できました。
おわりに
AWS Elemental MediaPackage において、VoD コンテンツに対してもオリジン保護の機能が追加されました!
MediaPackage + CloudFront の構成を取るときは必要不可欠な設定かと思いますので、必ず入れる様にしましょう。
この記事がどなたかのお役にたてば幸いです。
以上、AWS 事業本部の大前でした。